//
//  XQStudent.swift
//  XQMacRealmDemo
//
//  Created by WXQ on 2019/8/5.
//  Copyright © 2019 WXQ. All rights reserved.
//

import Cocoa
import Realm
import RealmSwift

class XQBookModel: Object {
    
    @objc dynamic var name = ""
    @objc dynamic var author = ""
    
    /// LinkingObjects 反向表示该对象的拥有者
    let owners = LinkingObjects(fromType: XQStudentModel.self, property: "books")
}

// 必须要继承 Object
class XQStudentModel: Object {
    
    /// 没有自增主键这个说法...
    /// 必须要有 @objc, Realm 才会自动把这个值视为 key, 存到本地
    /// 必须要有 dynamic (属性使用动态分发), 取值, 才能取的出来, 不然就会出现, 查， 是查出来了, 但是一直取属性, 取不出来
    
    /// 主key
    @objc dynamic var xq_id: String = UUID.init().uuidString
    /// 必有值
    @objc dynamic var name = ""
    var age = 18
    var weight = 156
    /// 可选值
    var address: String? = nil
    @objc dynamic var birthday: NSDate? = nil
    @objc dynamic var swiftBirthday: Date?  = nil
    @objc dynamic var photo: Data?  = nil
    
    
    //List 用来表示一对多的关系：一个 Student 中拥有多个 Book。
    let books = List<XQBookModel>()
    
    //重写 Object.primaryKey() 可以设置模型的主键。
    //声明主键之后，对象将被允许查询，更新速度更加高效，并且要求每个对象保持唯一性。
    //一旦带有主键的对象被添加到 Realm 之后，该对象的主键将不可修改。
    override static func primaryKey() -> String? {
        
        return "xq_id"
    }
    
    //重写 Object.ignoredProperties() 可以防止 Realm 存储数据模型的某个属性
//    override static func ignoredProperties() -> [String] {
//        return ["tempID"]
//    }
    
    //重写 Object.indexedProperties() 方法可以为数据模型中需要添加索引的属性建立索引，Realm 支持为字符串、整型、布尔值以及 Date 属性建立索引。
//    override static func indexedProperties() -> [String] {
//        return ["name"]
//    }
}


struct XQStudentRealmTool {
    /// 增
    static func insertStudent(by student: XQStudentModel) {
        let defaultRealm = XQRealm.getDB()
        if let defaultRealm = defaultRealm {
            try! defaultRealm.write {
                defaultRealm.add(student)
            }
        }
    }
    
    static func insertStudents(by students: [XQStudentModel]) {
        let defaultRealm = XQRealm.getDB()
        try? defaultRealm?.write {
            defaultRealm?.add(students)
        }
        
        // 更新
//        defaultRealm?.add(students, update: true)
    }
    
    // 查
    static func getAllStudent() -> Results<XQStudentModel>? {
        let defaultRealm = XQRealm.getDB()
        return defaultRealm?.objects(XQStudentModel.self)
    }
    
    static func getAllBook() -> Results<XQBookModel>? {
        let defaultRealm = XQRealm.getDB()
        return defaultRealm?.objects(XQBookModel.self)
    }
    
    static func getStudent(_ xq_id: String) -> XQStudentModel? {
        let defaultRealm = XQRealm.getDB()
        let result = defaultRealm?.object(ofType: XQStudentModel.self, forPrimaryKey: xq_id)
        return result
    }
    
    static func getStudent(withName name: String) -> Results<XQStudentModel>? {
        let result = self.getAllStudent()
        let predicate = NSPredicate.init(format: "name = '\(name)'")
        
        // 直接更新字段 name , 所有值为 123
//        result?.setValue("123", forKey: "name")
        
        return result?.filter(predicate)
    }
    
    // 删
    static func deleteAll() {
        let defaultRealm = XQRealm.getDB()
        try? defaultRealm?.write {
            defaultRealm?.deleteAll()
        }
    }
    
    
    
}











